#ifndef MPPT_PNO_F_H
#define MPPT_PNO_F_H_

#include "MY_INC/TI_SOLAR/SOLAR_F.h"
//*********** 结构体定义 ***********//
typedef struct
{
    float32 Ipv;             // 光伏组件当前电流
    float32 Vpv;             // 光伏组件当前电压
    float32 DeltaPmin;       // 功率变化最小阈值（用于死区抗噪）
    float32 MaxVolt;         // 最大允许输出电压（安全限制）
    float32 MinVolt;         // 最小允许输出电压（安全限制）
    float32 Stepsize;        // 电压调整步长（默认0.02-0.05V）
    float32 VmppOut;         // 输出的目标电压（驱动DC-DC变换器）
    float32 DeltaP;          // 功率变化量ΔP
    float32 PanelPower;      // 当前功率（Vpv*Ipv）
    float32 PanelPower_Prev; // 上一次计算的功率
    int16   mppt_enable;     // MPPT使能标志（1=启用）
    int16   mppt_first;      // 首次运行标志（初始化用）
} MPPT_PNO_F;

// //*********** 函数实现 ***********//
// void MPPT_PNO_F_FUNC(MPPT_PNO_F *v)
// {
//     if (v->mppt_enable == 1)
//     {
//         if (v->mppt_first == 1)
//         {
//             // 首次运行初始化
//             v->VmppOut = v->Vpv - 0.02f; // 初始电压略低于当前值
//             v->mppt_first = 0;
//             v->PanelPower_Prev = v->PanelPower;
//         }
//         else
//         {
//             // 计算当前功率和功率变化量
//             v->PanelPower = v->Vpv * v->Ipv;
//             v->DeltaP = v->PanelPower - v->PanelPower_Prev;

//             // 扰动观察法核心逻辑
//             if (v->DeltaP > v->DeltaPmin)
//             {
//                 // 功率增加则保持方向
//                 v->VmppOut = v->Vpv + v->Stepsize;
//             }
//             else if (v->DeltaP < -v->DeltaPmin)
//             {
//                 // 功率下降则反转方向
//                 v->Stepsize = -v->Stepsize;
//                 v->VmppOut = v->Vpv + v->Stepsize;
//             }
//             // 功率变化在死区范围内不调整

//             v->PanelPower_Prev = v->PanelPower;
//         }

//         // 电压安全限制（防止过压/欠压）
//         if (v->VmppOut < v->MinVolt)
//             v->VmppOut = v->MinVolt;
//         if (v->VmppOut > v->MaxVolt)
//             v->VmppOut = v->MaxVolt;
//     }
// }

#endif /*MPPT_PNO_F_H_*/